Load datasets

dat_main = read.delim("share-SIMBA-main.txt")
dat_truncated = read.delim("share-SIMBA-truncated-mob.txt")
dat_baseline = read.delim("share-SIMBA-rae-baseline.txt")
dat_dichotomized = read.delim("share-SIMBA-dichotomized-mob.txt")
dat_map = read.delim("share-SIMBA-map.txt")

dat_main = dat_main[order(as.numeric(as.character(dat_main$study_ID))), ]
dat_off = subset(dat_main, Cut_off_date=="Official")
dat_prim = subset(dat_off, Analysis=="Primary")
dat_mod = subset(dat_main, Analysis == "Primary")

S8. Descriptive analyses

Location of studies

ES distribution

Description

dat_map$continent = c("Oceania", "Asia", "America", "America", "Asia", "Europe", "Africa", "Europe", "Europe", "Europe", "Europe", "Europe", "Oceania", "Europe", "Europe", "Europe", "Africa", "Europe", "America")
continent = dat_map %>%
  group_by(continent) %>%
  summarise(n_studies = sum(n_studies)) 

paste0(
  # number raw data
  "Among them, we were able to access the data of ",
  length(unique(dat_prim[dat_prim$raw_data == "YES", ]$study_ID)),
  # number of unique studies
  " unique studies. Out of the ",
  length(unique(dat_mod$study_ID)),
   # number of participants
 " studies (n=",
  sum(dat_mod$N),
   # countries
  " participants), ",
  continent[continent$continent=="America", ]$n_studies,
  " were conducted in America (",
  "among which ",
  dat_map[dat_map$COUNTRY=="USA",]$n_studies,
  " were conducted in the USA), ",
  continent[continent$continent=="Europe", ]$n_studies,
  " in Europe, ",
  continent[continent$continent=="Oceania", ]$n_studies,
  " in Africa, ",
  continent[continent$continent=="Asia", ]$n_studies,
  " in Asia, and ",
  continent[continent$continent=="Africa", ]$n_studies,
  # variability participants
  " in Oceania. The number of participants per study ranged from ",
  min(as.numeric(dat_mod$N)),
  " to ",
  max(as.numeric(dat_mod$N)),
  ". The median length of follow up ranged from ",
  min(as.numeric(dat_mod$followupduration, na.rm=TRUE)),
  " years to ",
  round(max(as.numeric(dat_mod$followupduration), na.rm=TRUE)),
  " years (median=",
    round(median(as.numeric(dat_mod$followupduration), na.rm=TRUE)),
  " years, IQR=",
    round(IQR(as.numeric(dat_mod$followupduration), na.rm=TRUE)),
  " years). Among the ", 
    sum(dat_prim[!duplicated(dat_prim$study_ID),]$Cut_off_date=="Official"),
  " studies included in our main analyses, ",
  sum(dat_prim[!duplicated(dat_prim$study_ID),]$diag.procedure=="Diagnosis", na.rm=TRUE),
  " studies categorized ADHD using a formal diagnostic procedure, ",
  sum(dat_prim[!duplicated(dat_prim$study_ID),]$diag.procedure=="Symptoms", na.rm=TRUE),
" based on symptoms count, and ",
  sum(dat_prim[!duplicated(dat_prim$study_ID),]$diag.procedure=="Broad-based-scale", na.rm=TRUE),
  " based on the results of broad-based scales (such as the CBCL or SDQ)."
)
## [1] "Among them, we were able to access the data of 26 unique studies. Out of the 58 studies (n=6540 participants), 26 were conducted in America (among which 23 were conducted in the USA), 22 in Europe, 5 in Africa, 3 in Asia, and 2 in Oceania. The number of participants per study ranged from 10 to 813. The median length of follow up ranged from 4 years to 33 years (median=7 years, IQR=4 years). Among the 42 studies included in our main analyses, 21 studies categorized ADHD using a formal diagnostic procedure, 13 based on symptoms count, and 8 based on the results of broad-based scales (such as the CBCL or SDQ)."



S9. RAE baseline

Relative age effect at baseline

colnames(dat_baseline)[1:4] = paste0(colnames(dat_baseline)[1:4], "_base")
dat_baseline[,1:4] <- lapply(dat_baseline[,1:4], function(x) as.numeric(as.character(x)))

# dat_baseline = dplyr::left_join(dat_baseline, unique(dat_main[, c("Study", "study_ID", "Study_name", "Cut_off_date")])) 

res_mob_baseline <- meta::metagen(TE = logOR_base,
                        seTE = seOR_base,
                        method.tau = "REML",
                        n.e = as.numeric(dat_baseline$N_base),
                        sm = "OR",
                        studlab = paste(dat_baseline$Study_name),
                        data = dat_baseline)
res_mob_baseline
## Number of studies: k = 9
## Number of observations: o = 88753
## 
##                          OR           95%-CI    z  p-value
## Common effect model  1.0357 [1.0268; 1.0446] 7.99 < 0.0001
## Random effects model 1.0401 [1.0224; 1.0582] 4.48 < 0.0001
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0003 [0.0000; 0.0032]; tau = 0.0184 [0.0000; 0.0566]
##  I^2 = 49.8% [0.0%; 76.6%]; H = 1.41 [1.00; 2.07]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  15.95    8  0.0431
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_mob_baseline,
           title = "Association of relative age with \n childhood ADHD")



S10. Primary analysis

Main model

res_prim <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Study_name),
                        data = dat_prim)
res_prim
## Number of studies: n = 42
## Number of estimates: k = 44
## Number of observations: o = 4744
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0238 [0.9892; 1.0595] 1.34  0.1798
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0043 [0.0000; 0.0119]; tau.1 = 0.0654 [0.0000; 0.1089] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0077]; tau.2 < 0.0001 [0.0000; 0.0879] (within cluster)
##  I^2 = 43.3% [18.8%; 60.4%]; H = 1.33 [1.11; 1.59]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  75.85   43  0.0015
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_prim,
           title = "Association of relative age with \n persistence of ADHD")

Equivalence tests

tost = metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim, level = 90)
## [1] "Even if one considers OR=0.99 to be a practically significant value, post-hoc equivalence tests would show that even if relative age leads to a decrease in the persistence of ADHD, this effect is extremely small OR=0.995"



S11. Sensitivity analyses

1. Truncated MoB

Main model

dat_truncated$Analysis = "Truncated MoB"

df_trunc = rbind(
  dat_truncated,
  dat_prim[,c(colnames(dat_truncated))]) %>%
    group_by(Study) %>%
    mutate(n=n()) %>%
    filter(n>1)

df_trunc[1:4] <- apply(df_trunc[1:4], 2, as.numeric)

V.SCE  <- with(df_trunc,
  clubSandwich::impute_covariance_matrix(
    vi = seOR^2, 
    cluster = Study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = Analysis))
## Registered S3 method overwritten by 'clubSandwich':
##   method    from    
##   bread.mlm sandwich
res_trunc <- metafor::rma.mv(yi= logOR, V = V.SCE,
                       data = df_trunc, 
                       mods = ~ Analysis - 1,
                       random = ~ Analysis | Study,
                       struct = "DIAG",
                       sparse = TRUE)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
# metafor::profile.rma.mv(res_trunc)
res_trunc
## 
## Multivariate Meta-Analysis Model (k = 46; method: REML)
## 
## Variance Components:
## 
## outer factor: Study    (nlvls = 23)
## inner factor: Analysis (nlvls = 2)
## 
##             estim    sqrt  k.lvl  fixed          level 
## tau^2.1    0.0000  0.0000     23     no        Primary 
## tau^2.2    0.0000  0.0000     23     no  Truncated MoB 
## 
## Test for Residual Heterogeneity:
## QE(df = 44) = 38.3650, p-val = 0.7111
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 4.3258, p-val = 0.1150
## 
## Model Results:
## 
##                        estimate      se    zval    pval    ci.lb   ci.ub    
## AnalysisPrimary          0.0465  0.0225  2.0680  0.0386   0.0024  0.0906  * 
## AnalysisTruncated MoB    0.0050  0.0225  0.2219  0.8244  -0.0391  0.0491    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dat_S1 = dat_truncated
dat_S1$study_ID =gsub(" *_.", "", dat_S1$Study)
  
res_S1 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S1$N),
                        sm = "OR",
                        studlab = paste(dat_S1$Study_name),
                        data = dat_S1)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
res_S1
## Number of studies: n = 22
## Number of estimates: k = 23
## Number of observations: o = 1338
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0072 [0.9536; 1.0638] 0.26  0.7974
## 
## Quantifying heterogeneity:
##  tau^2.1 < 0.0001 [0.0000; 0.0129]; tau.1 < 0.0001 [0.0000; 0.1135] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0094]; tau.2 < 0.0001 [0.0000; 0.0967] (within cluster)
##  I^2 = 0.0% [0.0%; 45.4%]; H = 1.00 [1.00; 1.35]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  17.99   22  0.7066
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

2. Follow-up > 10yo & meta-reg

Main model

dat_S2 <- data.frame(subset(dat_off, grepl("S1:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

res_S2 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S2$N),
                        sm = "OR",
                        studlab = paste(dat_S2$Study_name),
                        data = dat_S2)
res_S2
## Number of studies: k = 11
## Number of observations: o = 513
## 
##                          OR           95%-CI    z p-value
## Common effect model  1.0058 [0.9520; 1.0627] 0.21  0.8357
## Random effects model 1.0043 [0.9294; 1.0853] 0.11  0.9131
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0075 [0.0000; 0.0391]; tau = 0.0865 [0.0000; 0.1978]
##  I^2 = 45.0% [0.0%; 72.7%]; H = 1.35 [1.00; 1.91]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  18.18   10  0.0521
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S2,
             smlab = "Association of relative age with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

Post hoc analyses

meta::metareg(res_prim, formula = follow_cat, intercept = FALSE)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0044  0.0660     42     no       .id 
## sigma^2.2  0.0000  0.0000     44     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 71.0602, p-val = 0.0025
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.7925, p-val = 0.4247
## 
## Model Results:
## 
##                  estimate      se    zval    pval    ci.lb   ci.ub    
## follow_cat4-6      0.0441  0.0294  1.4981  0.1341  -0.0136  0.1018    
## follow_cat6-8.5    0.0217  0.0293  0.7403  0.4591  -0.0357  0.0791    
## follow_cat8.5+     0.0050  0.0261  0.1908  0.8487  -0.0461  0.0561    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = followupduration)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0036  0.0597     42     no       .id 
## sigma^2.2  0.0000  0.0000     44     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 42) = 68.9835, p-val = 0.0054
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 4.4209, p-val = 0.0355
## 
## Model Results:
## 
##                   estimate      se     zval    pval    ci.lb    ci.ub    
## intrcpt             0.0723  0.0285   2.5325  0.0113   0.0163   0.1282  * 
## followupduration   -0.0052  0.0025  -2.1026  0.0355  -0.0101  -0.0004  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_fo <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = dat_prim$follow_cat,
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Study_name),
                        data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
meta::forest(res_fo,
             smlab = "Association of relative age with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

3. Age <=8 baseline & >=16 follow up

Main model

dat_S3 <- data.frame(subset(dat_off, grepl("S2:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

res_S3 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S3$N),
                        sm = "OR",
                        studlab = paste(dat_S3$Study_name),
                        data = dat_S3)
res_S3
## Number of studies: k = 10
## Number of observations: o = 331
## 
##                          OR           95%-CI     z p-value
## Common effect model  0.9793 [0.9127; 1.0508] -0.58  0.5608
## Random effects model 0.9659 [0.8590; 1.0860] -0.58  0.5616
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0198 [0.0027; 0.1314]; tau = 0.1409 [0.0516; 0.3625]
##  I^2 = 61.6% [23.6%; 80.7%]; H = 1.61 [1.14; 2.28]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  23.46    9  0.0052
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S3,
             smlab = "Association of relative age with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

4. Same ADHD tool baseline & follow up

Main model

dat_S4 <- data.frame(subset(dat_off, grepl("S3:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

res_S4 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S4$N),
                        sm = "OR",
                        studlab = paste(dat_S4$Study_name),
                        data = dat_S4)
res_S4
## Number of studies: n = 17
## Number of estimates: k = 19
## Number of observations: o = 2853
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0592 [1.0069; 1.1143] 2.22  0.0261
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0047 [0.0000; 0.0176]; tau.1 = 0.0683 [0.0000; 0.1326] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0075]; tau.2 < 0.0001 [0.0000; 0.0869] (within cluster)
##  I^2 = 52.1% [19.1%; 71.6%]; H = 1.45 [1.11; 1.88]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  37.59   18  0.0044
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S4,
           title = "Association of relative age with \n childhood ADHD")



S12. Robustness checks

1. Jackknife meta-analysis

repNA = rep(NA, length(unique(dat_prim$study_ID)))
res_S5 = data.frame(es=repNA, ci_lo = repNA, ci_up = repNA, pval = repNA, cohort_excluded=repNA, id = repNA)
list_meta_S5=NULL; id=0
for (cohort in unique(dat_prim$study_ID)) {
  
  res = NA
  id = id+1
  res = meta::metagen(
    TE = logOR,
    seTE = seOR,
    cluster = study_ID,
    method.tau = "REML",
    sm = "OR",
    data = subset(dat_prim, study_ID != cohort))
  
  i = which(unique(dat_prim$study_ID) == cohort)
  list_meta_S5 = append(list_meta_S5, summary(res))
  res_S5$es[i] = res$TE.random
  res_S5$ci_lo[i] = res$lower.random
  res_S5$ci_up[i] = res$upper.random
  res_S5$pval[i] = res$pval.random
  res_S5$cohort_excluded[i] = cohort
  res_S5$id[i] = id
}
res_S5[,1:3] <- exp(res_S5[,1:3])
largest_S5 = meta::metagen(
    TE = logOR,
    seTE = seOR,
    n.e = N,
    cluster = study_ID,
    method.tau = "REML",
    sm = "OR",
    data = subset(dat_prim, study_ID != res_S5[res_S5$pval==max(res_S5$pval), ]$cohort))
  
smallest_S5 = meta::metagen(
    TE = logOR,
    seTE = seOR,
    cluster = study_ID,
    n.e = N,
    method.tau = "REML",
    sm = "OR",
    data = subset(dat_prim, study_ID != res_S5[res_S5$pval==min(res_S5$pval), ]$cohort))
# res_S5[order(res_S5$es), ]

2. Cook’s distance

Main model

res <- metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim)
x <- cooks.distance(res)
plot(x, type="o", pch=19, xlab="Observed Outcome", ylab="Cook's Distance")

influential <- unique(dat_prim$Study_name)[which(x > (3 * mean(x))) ]

dat_S6 <- dat_prim %>%
  filter(!Study_name %in% influential)

res_S6 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S6$N),
                        sm = "OR",
                        studlab = paste(dat_S6$Study_name),
                        data = dat_S6)
res_S6
## Number of studies: n = 40
## Number of estimates: k = 42
## Number of observations: o = 4621
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0140 [0.9942; 1.0342] 1.38  0.1684
## 
## Quantifying heterogeneity:
##  tau^2.1 < 0.0001 [0.0000; 0.0030]; tau.1 < 0.0001 [0.0000; 0.0543] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0019]; tau.2 < 0.0001 [0.0000; 0.0432] (within cluster)
##  I^2 = 10.1% [0.0%; 38.5%]; H = 1.05 [1.00; 1.28]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  45.63   41  0.2856
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S6,
           title = "Association of relative age with \n childhood ADHD")

3. Robust regression

Main model

dat_S7_cor <- data.frame(subset(dat_off, grepl("S6:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

dat_S7_uncor <- subset(dat_off, grepl("Primary", dat_off$Analysis, fixed = TRUE) & !Study %in% dat_S7_cor$Study)

dat_S7 = dplyr::bind_rows(dat_S7_cor, dat_S7_uncor)

res_S7 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S7$N),
                        sm = "OR",
                        studlab = paste(dat_S7$Study_name),
                        data = dat_S7)
res_S7
## Number of studies: n = 42
## Number of estimates: k = 44
## Number of observations: o = 4744
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0233 [0.9890; 1.0588] 1.32  0.1853
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0041 [0.0000; 0.0115]; tau.1 = 0.0643 [0.0000; 0.1070] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0075]; tau.2 < 0.0001 [0.0000; 0.0868] (within cluster)
##  I^2 = 40.9% [15.1%; 58.9%]; H = 1.30 [1.09; 1.56]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  72.76   43  0.0031
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S7,
           title = "Association of relative age with \n childhood ADHD")

4. Dichotomized MoB

dat_dichotomized[1:4] <- apply(dat_dichotomized[1:4], 2, as.numeric)
dat_S8 =  dat_dichotomized
res_S8 <- meta::metagen(TE = logOR,
                          seTE = seOR,
                          cluster = study_ID,
                          method.tau = "REML",
                          n.e = as.numeric(dat_S8$N),
                          sm = "OR",
                          studlab = paste(dat_S8$Study_name),
                          data = dat_S8)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
res_S8
## Number of studies: n = 25
## Number of estimates: k = 26
## Number of observations: o = 1430
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.2945 [0.9927; 1.6881] 1.91  0.0567
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0028 [0.0000; 0.4124]; tau.1 = 0.0529 [0.0000; 0.6422] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.2872]; tau.2 < 0.0001 [0.0000; 0.5359] (within cluster)
##  I^2 = 0.0% [0.0%; 43.2%]; H = 1.00 [1.00; 1.33]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  14.47   25  0.9530
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau
fct_forest(data = res_S8,
           title = "Association of relative age with \n persistence of ADHD")



S13. Meta-regressions

1. Cohort with RAE assessment

Main model

dat_rae = subset(dat_prim, Study %in% dat_baseline$Study)
dat_rae$p_sig = ifelse(dat_rae$Study %in% subset(dat_baseline, pOR_base < 0.05)$Study, "RAE at baseline: sig", "RAE at baseline: ns")
dat_rae$or_larg = ifelse(dat_rae$Study %in% subset(dat_baseline, exp(logOR_base) >= 1.05)$Study, "RAE at baseline: large", "RAE at baseline: small")
res_rae <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Study_name),
                        data = dat_rae)

res_rae_p = meta::metareg(res_rae, formula = p_sig, intercept = TRUE)
res_rae_or = meta::metareg(res_rae, formula = or_larg, intercept = TRUE)
res_rae_p_woi = meta::metareg(res_rae, formula = p_sig, intercept = FALSE)
res_rae_or_woi = meta::metareg(res_rae, formula = or_larg, intercept = FALSE)
res_rae_p
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0007)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## R^2 (amount of heterogeneity accounted for):            0.00%
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 5.5244, p-val = 0.5962
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 1.8114, p-val = 0.1783
## 
## Model Results:
## 
##                            estimate      se     zval    pval    ci.lb   ci.ub 
## intrcpt                     -0.0394  0.0395  -0.9961  0.3192  -0.1168  0.0381 
## p_sigRAE at baseline: sig    0.0566  0.0421   1.3459  0.1783  -0.0258  0.1390 
##                              
## intrcpt                      
## p_sigRAE at baseline: sig    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_or
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0006)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## R^2 (amount of heterogeneity accounted for):            0.00%
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 6.3419, p-val = 0.5004
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.9938, p-val = 0.3188
## 
## Model Results:
## 
##                                estimate      se     zval    pval    ci.lb 
## intrcpt                          0.0635  0.0548   1.1596  0.2462  -0.0439 
## or_largRAE at baseline: small   -0.0564  0.0565  -0.9969  0.3188  -0.1672 
##                                 ci.ub    
## intrcpt                        0.1709    
## or_largRAE at baseline: small  0.0545    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_p_woi
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0007)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 5.5244, p-val = 0.5962
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 2.4254, p-val = 0.2974
## 
## Model Results:
## 
##                            estimate      se     zval    pval    ci.lb   ci.ub 
## p_sigRAE at baseline: ns    -0.0394  0.0395  -0.9961  0.3192  -0.1168  0.0381 
## p_sigRAE at baseline: sig    0.0172  0.0144   1.1972  0.2312  -0.0110  0.0455 
##                              
## p_sigRAE at baseline: ns     
## p_sigRAE at baseline: sig    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_or_woi
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0006)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 6.3419, p-val = 0.5004
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 1.6078, p-val = 0.4476
## 
## Model Results:
## 
##                                estimate      se    zval    pval    ci.lb 
## or_largRAE at baseline: large    0.0635  0.0548  1.1596  0.2462  -0.0439 
## or_largRAE at baseline: small    0.0072  0.0140  0.5130  0.6079  -0.0202 
##                                 ci.ub    
## or_largRAE at baseline: large  0.1709    
## or_largRAE at baseline: small  0.0345    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_rae_p_sub <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = dat_rae$p_sig,
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Study_name),
                        data = dat_rae)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
res_rae_or_sub <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = dat_rae$or_larg,
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Study_name),
                        data = dat_rae)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_rae_p_sub,
           title = "Association of relative age with \n persistence of ADHD")

fct_forest(data = res_rae_or_sub,
           title = "Association of relative age with \n childhood ADHD")

2. ADHD diagnosis tool

Model

meta::metareg(res_prim, formula = diag.procedure, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0043  0.0659     42     no       .id 
## sigma^2.2  0.0000  0.0000     44     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 66.4998, p-val = 0.0071
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.7630, p-val = 0.4296
## 
## Model Results:
## 
##                                  estimate      se     zval    pval    ci.lb 
## diag.procedureBroad-based-scale   -0.0028  0.0344  -0.0820  0.9347  -0.0702 
## diag.procedureDiagnosis            0.0267  0.0248   1.0752  0.2823  -0.0220 
## diag.procedureSymptoms             0.0457  0.0361   1.2650  0.2059  -0.0251 
##                                   ci.ub    
## diag.procedureBroad-based-scale  0.0646    
## diag.procedureDiagnosis          0.0754    
## diag.procedureSymptoms           0.1164    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = Baseline_diag, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0041  0.0644     42     no       .id 
## sigma^2.2  0.0000  0.0000     44     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 69.3652, p-val = 0.0037
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 4.9932, p-val = 0.1723
## 
## Model Results:
## 
##                                 estimate      se     zval    pval    ci.lb 
## Baseline_diagBroad-based-scale   -0.0054  0.0387  -0.1403  0.8884  -0.0812 
## Baseline_diagDiagnosis            0.0113  0.0231   0.4912  0.6233  -0.0339 
## Baseline_diagSymptoms             0.0785  0.0361   2.1754  0.0296   0.0078 
##                                  ci.ub    
## Baseline_diagBroad-based-scale  0.0704    
## Baseline_diagDiagnosis          0.0566    
## Baseline_diagSymptoms           0.1493  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = Follow_up_diag, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0043  0.0657     42     no       .id 
## sigma^2.2  0.0000  0.0000     44     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 66.2649, p-val = 0.0075
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.8131, p-val = 0.4214
## 
## Model Results:
## 
##                                  estimate      se     zval    pval    ci.lb 
## Follow_up_diagBroad-based-scale   -0.0028  0.0343  -0.0818  0.9348  -0.0700 
## Follow_up_diagDiagnosis            0.0264  0.0245   1.0735  0.2830  -0.0218 
## Follow_up_diagSymptoms             0.0474  0.0368   1.2860  0.1984  -0.0248 
##                                   ci.ub    
## Follow_up_diagBroad-based-scale  0.0644    
## Follow_up_diagDiagnosis          0.0745    
## Follow_up_diagSymptoms           0.1196    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_diag <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        subgroup = diag.procedure,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Study_name),
                        data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_diag,
           title = "Association of relative age with \n childhood ADHD")

3. Sampling type

Model

meta::metareg(res_prim, formula = Sampling_cat, intercept = TRUE)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0046  0.0677     42     no       .id 
## sigma^2.2  0.0000  0.0000     44     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 74.1360, p-val = 0.0012
## 
## Test of Moderators (coefficients 2:3):
## QM(df = 2) = 1.9762, p-val = 0.3723
## 
## Model Results:
## 
##                                                             estimate      se 
## intrcpt                                                      -0.0832  0.1138 
## Sampling_catConvenient cases                                  0.0886  0.1169 
## Sampling_catPopulation-based/Very large community (N>1000)    0.1263  0.1164 
##                                                                zval    pval 
## intrcpt                                                     -0.7314  0.4646 
## Sampling_catConvenient cases                                 0.7582  0.4483 
## Sampling_catPopulation-based/Very large community (N>1000)   1.0852  0.2778 
##                                                               ci.lb   ci.ub    
## intrcpt                                                     -0.3062  0.1398    
## Sampling_catConvenient cases                                -0.1405  0.3178    
## Sampling_catPopulation-based/Very large community (N>1000)  -0.1018  0.3543    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = Sampling_cat, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0046  0.0677     42     no       .id 
## sigma^2.2  0.0000  0.0000     44     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 74.1360, p-val = 0.0012
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 3.7036, p-val = 0.2953
## 
## Model Results:
## 
##                                                             estimate      se 
## Sampling_catCommunity                                        -0.0832  0.1138 
## Sampling_catConvenient cases                                  0.0054  0.0269 
## Sampling_catPopulation-based/Very large community (N>1000)    0.0431  0.0243 
##                                                                zval    pval 
## Sampling_catCommunity                                       -0.7314  0.4646 
## Sampling_catConvenient cases                                 0.2019  0.8400 
## Sampling_catPopulation-based/Very large community (N>1000)   1.7686  0.0770 
##                                                               ci.lb   ci.ub    
## Sampling_catCommunity                                       -0.3062  0.1398    
## Sampling_catConvenient cases                                -0.0473  0.0581    
## Sampling_catPopulation-based/Very large community (N>1000)  -0.0047  0.0908  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_sampling <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        subgroup = Sampling_cat,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Study_name),
                        data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_sampling,
           title = "Association of relative age with \n childhood ADHD")

4. ADHD subtypes

Main model

dat_subtype <- data.frame(subset(dat_off, grepl("S8:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID) %>%
  filter(Cut_off_date == "Official")

res_subtype <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_subtype$N),
                        sm = "OR",
                        studlab = paste(dat_subtype$Study_name),
                        data = dat_subtype)

res_subtype_reg = meta::metareg(res_subtype, formula = Analysis, intercept = TRUE)
res_subtype_reg
## 
## Multivariate Meta-Analysis Model (k = 31; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     19     no       .id 
## sigma^2.2  0.0027  0.0518     31     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 28) = 30.4927, p-val = 0.3401
## 
## Test of Moderators (coefficients 2:3):
## QM(df = 2) = 0.0631, p-val = 0.9689
## 
## Model Results:
## 
##                                       estimate      se     zval    pval 
## intrcpt                                -0.0023  0.0290  -0.0810  0.9354 
## AnalysisS8: Hyperactive presentation   -0.0045  0.0786  -0.0577  0.9540 
## AnalysisS8: Inattentive presentation   -0.0161  0.0641  -0.2507  0.8020 
##                                         ci.lb   ci.ub    
## intrcpt                               -0.0592  0.0545    
## AnalysisS8: Hyperactive presentation  -0.1585  0.1494    
## AnalysisS8: Inattentive presentation  -0.1416  0.1095    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

fct_forest(data = res_subtype,
           title = "Association of relative age with \n childhood ADHD")

5. Above vs. below IQ median

Main model

dat_IQ <- data.frame(subset(dat_off, grepl("S9:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID) %>%
  filter(Cut_off_date == "Official")

res_IQ <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_IQ$N),
                        sm = "OR",
                        studlab = paste(dat_IQ$Study_name),
                        data = dat_IQ)
res_IQ_reg = meta::metareg(res_IQ, formula = Analysis, intercept = TRUE)
res_IQ_reg
## 
## Multivariate Meta-Analysis Model (k = 36; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     22     no       .id 
## sigma^2.2  0.0033  0.0579     36     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 34) = 42.3375, p-val = 0.1543
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.0063, p-val = 0.9367
## 
## Model Results:
## 
##                              estimate      se     zval    pval    ci.lb   ci.ub 
## intrcpt                        0.0188  0.0345   0.5440  0.5865  -0.0489  0.0865 
## AnalysisS9: IQ below median   -0.0037  0.0464  -0.0795  0.9367  -0.0946  0.0872 
##                                
## intrcpt                        
## AnalysisS9: IQ below median    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_IQ_plot <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = Analysis,
                        n.e = as.numeric(dat_IQ$N),
                        sm = "OR",
                        studlab = paste(dat_IQ$Study_name),
                        data = dat_IQ)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_IQ_plot,
           title = "Association of relative age with \n childhood ADHD")

6. Strict vs. flexible cut-off

Code

res_mod <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = Cut_off_date,
                        n.e = as.numeric(dat_mod$N),
                        sm = "OR",
                        studlab = paste(dat_mod$Study_name),
                        data = dat_mod)
res_mod_reg = meta::metareg(res_mod, formula = Cut_off_date, intercept = TRUE)
res_mod_reg_woi = meta::metareg(res_mod, formula = Cut_off_date, intercept = FALSE)
res_mod_reg
## 
## Multivariate Meta-Analysis Model (k = 62; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0033  0.0574     58     no       .id 
## sigma^2.2  0.0000  0.0000     62     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 60) = 92.9797, p-val = 0.0041
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 1.9915, p-val = 0.1582
## 
## Model Results:
## 
##                       estimate      se     zval    pval    ci.lb   ci.ub    
## intrcpt                 0.0237  0.0164   1.4455  0.1483  -0.0084  0.0559    
## Cut_off_dateProbable   -0.0444  0.0315  -1.4112  0.1582  -0.1061  0.0173    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_mod_reg_woi
## 
## Multivariate Meta-Analysis Model (k = 62; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0033  0.0574     58     no       .id 
## sigma^2.2  0.0000  0.0000     62     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 60) = 92.9797, p-val = 0.0041
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 2.6838, p-val = 0.2614
## 
## Model Results:
## 
##                       estimate      se     zval    pval    ci.lb   ci.ub    
## Cut_off_dateOfficial    0.0237  0.0164   1.4455  0.1483  -0.0084  0.0559    
## Cut_off_dateProbable   -0.0207  0.0269  -0.7708  0.4408  -0.0734  0.0320    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_mod_plot <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = Cut_off_date,
                        n.e = as.numeric(dat_mod$N),
                        sm = "OR",
                        studlab = paste(dat_mod$Study_name),
                        data = dat_mod)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_mod_plot,
           title = "Association of relative age with \n childhood ADHD")

S14. Small study effects

small_std = metafor::rma.mv(logOR ~ 1 + seOR, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
small_std
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed          factor 
## sigma^2.1  0.0000  0.0000     42     no        study_ID 
## sigma^2.2  0.0000  0.0000     44     no  study_ID/es_id 
## 
## Test for Residual Heterogeneity:
## QE(df = 42) = 75.8354, p-val = 0.0011
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.0148, p-val = 0.9032
## 
## Model Results:
## 
##          estimate      se     zval    pval    ci.lb   ci.ub    
## intrcpt    0.0248  0.0157   1.5845  0.1131  -0.0059  0.0555    
## seOR      -0.0299  0.2460  -0.1217  0.9032  -0.5122  0.4523    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

S15. Summary of main results

extract.meta = function(x) {
    data.frame(
      TE=x$TE.random, 
      seTE=x$seTE.random,
      I2=x$I2,
      TAU2=sum(x$tau2),
      N=sum(x$n.e),
      STUDY=x$k.study)
}
library(meta)
## Loading 'meta' package (version 6.5-0).
## Type 'help(meta)' for a brief overview.
## Readers of 'Meta-Analysis with R (Use R!)' should install
## older version of 'meta' package: https://tinyurl.com/dt4y5drs
res_summary = do.call(rbind, lapply(
  list(res_prim, res_S1, res_S2, res_S3, 
       res_S4, smallest_S5, largest_S5, res_S6, res_S7),
  extract.meta))

res_summary$Analysis = c(
  "Primary", "Excluding MoB",
  "Follow-up > 10yo",
  "Outside 8-16yo range",
  "Same diagnosis tool",
  "Smallest (Jackknife)",
  "Largest (Jackknife)",
  "Cook's distance",
  "Robust regression")
res_summary$Type = rep(c("Primary analysis", "Sensitivity analyses", "Robustness analyses"), c(1, 3,5))
meta_all = metagen(TE=TE, seTE=seTE,
                   studlab=paste(res_summary$Analysis),
                   subgroup = paste(res_summary$Type),
                   n.e=as.numeric(res_summary$N),
                   data=res_summary, sm="OR")

forest(meta_all,
      leftcols = c("studlab", "STUDY", "n.e", "I2"),
      leftlabs = c("Study", "n-study", "N", "I²"),
     common = FALSE,
     hetstat = FALSE,
     random = FALSE,
      weight.study = "same",
       at=c(0.66, 1.00, 1.50),
       print.tau2 = FALSE,
       prediction = FALSE,
       xlim = c(0.66, 1.50),
       col.predict = "black",
      print.subgroup.name = FALSE,
       digits.se = 2)